/**
 * 旋转数组
 * https://leetcode-cn.com/problems/rotate-array/
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function (nums, k) {

  let len = nums.length
  let offset = k % len
  // 特殊情况：偏移量为0，或者偏移长度和数组总长度相同，直接返回
  if (!offset || len === offset) {
    return nums
  }

  let tempLen = 0
  let count = 0
  let mid = nums[0]
  let current = 0
  while (count < len) {
    let next = (offset + current) % len

    // 交换赋值，实现位移，并保存下一个将位移的数值
    let tempMid = mid
    mid = nums[next]
    nums[next] = tempMid

    // 将当前指针指向下一个位置，准备下一个数字的位移
    current = next

    // 累加总位移值 
    tempLen += offset

    // 数字的位移累加值，如果能被len整除，说明已经遍历了一圈，如果再遍历下去，就会替换回来，此时需要重新开始另外一个圈的遍历
    // 以防漏掉，采用当前位置+1的方式
    if (tempLen % len === 0) {
      current = (current + 1) % offset

      // 更新下一个将位移的值
      mid = nums[current]

      // 重新统计总位移值
      tempLen = 0
    }
    count++
  }
};


let nums = [1, 2, 3, 4, 5, 6, 7], k = 3

rotate(nums, k)
console.log(nums)

//================v3要点总结===============
/**
 * 1.这个版本尝试对每个位置的值进行映射
 * 2.判断需要跳位的条件不能是值，因为值会重复
 * 3.当圈的总长度能被len除尽时，说明回到了起点，此时应进行下一个圈的遍历替换
 */